package com.config;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.server.shop.ShopDao;
import com.util.IOUtil;
import com.util.StrKit;
/**
 * 存储一些经常用到的数据，集中一起
 * @author mwg
 *
 */
@Component
public class ConstService {
	
	@Autowired
	RedisService redisS;
	@Autowired
	ShopDao shopDao;
	
	public int ifredis=ConstDefine.getIfRedis();//是否使用REDIS，1=使用，0=不使用（变量存入内存中）
	String key_uuid="uuid";//uuid的前缀
	String key_appuser="appuser";//存储APPuser的前缀
	String key_miniuser="miniuser";//存储Miniuser的前缀
	String key_sms="sms";//存储短信的前缀
	private int smsCodeTime=5;//短信有效时长
	public static Map<String, Map<String, Object>> smsCode=new HashMap<String, Map<String, Object>>();//存储用户短信的map,如果后期改成redis，可以直接在此处修改
	public static Map<String, Map<String, Object>> loginUser=new HashMap<String, Map<String, Object>>();//存储登陆用户信息的MAP
	public static Map<String, String> usertoken=new HashMap<String, String>();//存储用户ID和对应TOKEN信息的MAP
	public static Map<String, Map<String, Object>> appUser=new HashMap<String, Map<String, Object>>();//存储用户ID和对应的信息，用户APP使用，适用userid+datakey验证方法，和token非一套操作
	public static Map<String, Map<String, Object>> miniUser=new HashMap<String, Map<String, Object>>();//存储用户ID和对应的信息，用户小程序使用，适用userid+datakey验证方法，和token非一套操作
	public static Map<String, String> userUUID=new HashMap<String, String>();//存储用户ID，和对应有效得UUID
	public static Map<String, double[]> carPredict=new HashMap<String, double[]>();//二手车估值公式
	public static Map<String, String> sysConfig=new HashMap<String, String>();//存储系统参数
	public static List<Map<String, Object>> goodsClasses=new ArrayList<Map<String,Object>>();//存放所有商品分类
	public static List<Map<String, Object>> provinceList=new ArrayList<Map<String,Object>>();//存放所有省
	public static Map<String, List<Map<String, Object>>> cityList = new HashMap<String, List<Map<String,Object>>>();//存放所有市
	public static Map<String, List<Map<String, Object>>> areaList = new HashMap<String, List<Map<String,Object>>>();//存放所有区

//	//初始化
//	@PostConstruct
//	public void serverInit()
//	{
//		//初始化所有省
//		List<Map<String, Object>> provinceData = shopDao.getProvince();
//		provinceList=provinceData;
//		String pid="";
//		//初始化所有市。区域因为数据太大，查询时从数据库中获取
//		for(int i=0;i<provinceData.size();i++)
//		{
//			Map<String, Object> map = provinceData.get(i);
//			pid=map.get("provinceID").toString();
//			List<Map<String, Object>> list = shopDao.getCity(pid);
//			cityList.put(pid, list);
//		}
//		
//		
//		System.out.println("init done!");
//	}
	/**
	 * 像redis中存储openid对应的推荐人,保存10分钟
	 * @param openid
	 * @param tjcode
	 */
	public void setOpenid2Tjcode(String openid,String tjcode)
	{
		redisS.setVal("o2t_"+openid, tjcode, 10);
	}
	/**
	 * 根据openid查询存储的推荐人
	 * @param openid
	 * @return
	 */
	public String getTjcodeByOpenid(String openid)
	{
		String tjcode = "";
		if(StrKit.notBlank(openid))
		{
			tjcode = redisS.getStrVal("o2t_"+openid);
		}
		
		return tjcode;
	}
	
	/**
	 * 获取所有商品分类
	 * @return
	 */
	public List<Map<String, Object>> getGoodsClasses()
	{
		//如果goodsclass是空得，则查询插值
		if(goodsClasses==null||!goodsClasses.contains("id"))
		{
			goodsClasses=shopDao.getGoodsClass();
		}
		
		return goodsClasses;
	}
	
	
	/**
	 * 检测用户ID和UUID是否有权限
	 * @param userid
	 * @param uuid
	 * @return
	 */
	public boolean checkUUID(String userid,String uuid)
	{
		return true;
//		boolean res=false;
//		String key=key_uuid+userid;
//		String uuid_server="";//服务器存储的UUID
//		//获取服务器的UUID
//		if(ifredis==1)uuid_server=redisS.getStrVal(key);//从redis获取UUID
//		if(ifredis==0)uuid_server=userUUID.get(key);//从内存获取UUID
//		if(uuid_server.isEmpty())//如果之前没有，代表首次登录，直接算成功
//		{
//			setUUID(key, uuid);
//			res=true;
//		}else{
//			if(uuid_server.equals(uuid))
//			{
//				res=true;//和原来存储的相同，代表还是之前的设备在访问
//			}else{
//				res=false;//和原来存储的相同，代表是被踢掉的设备在访问
//			}
//		}
//		
//		
//		return res;
	}
	/**
	 * 放入uuid
	 * @param userid
	 * @param uuid
	 */
	public void setUUID(String userid,String uuid)
	{
		String key=key_uuid+userid;
		userUUID.put(key, uuid);//无论使用使用REDIS，都将UUID存入MAP
		if(ifredis==1)redisS.setVal(key, uuid);
	}
	
	/**
	 * 获取APP用户登陆信息
	 * @param userid
	 * @return
	 */
	public Map<String, Object> getAppUser(String userid)
	{
		String key = key_appuser+userid;
		if(ifredis==1){
			String userStr = (String)redisS.getVal(key);
			if(StrKit.notBlank(userStr))
			{
				JSONObject userjson=new JSONObject(userStr);
				return userjson.toMap();
			}else{
				return null;
			}
		}else{
			return appUser.get(key);
		}
		
	}
	/**
	 * 获取MINI用户登陆信息
	 * @param userid
	 * @return
	 */
	public Map<String, Object> getMiniUser(String openid)
	{
		String key = key_miniuser+openid;
		if(ifredis==1){
			String userStr = (String)redisS.getVal(key);
			if(StrKit.notBlank(userStr))
			{
				JSONObject userjson=new JSONObject(userStr);
				return userjson.toMap();
			}else{
				return null;
			}
		}else{
			return miniUser.get(key);
		}
		
	}
	/**
	 * 设置APP用户登陆信息
	 * @param userid
	 * @return
	 */
	public void setAppUser(Map<String, Object> user)
	{
		if(user!=null&&user.containsKey("id"))
		{
			String key=key_appuser+user.get("id").toString();
			if(ifredis==1)redisS.setVal(key, user);
			appUser.put(key, user);
		}
	}
	/**
	 * 设置MINI用户登陆信息
	 * @param userid
	 * @return
	 */
	public void setMiniUser(Map<String, Object> user)
	{
		if(user!=null&&user.containsKey("openid"))
		{
			String key=key_miniuser+user.get("id").toString();
			if(ifredis==1)redisS.setVal(key, user);
			miniUser.put(key, user);
		}
	}
	/**
	 * 设置验证码
	 * @param phone
	 * @param code
	 */
	public void setSmsCode(String phone,String code)
	{
		String key=key_sms+phone;
		if(ifredis==1){
			redisS.setVal(key, code, smsCodeTime);
		}else{
			Map<String, Object> map=new HashMap<String, Object>();
			map.put("code", code);
			map.put("ctime", IOUtil.getdate("yyyy-MM-dd HH:mm:ss"));
			smsCode.put(key, map);
		}
	}
	/**
	 * 根据Phone获取sms信息
	 * @param phone
	 * @return
	 */
	public String getSmsCode(String phone)
	{
		String res="";
		String key=key_sms+phone;
		if(ifredis==1)
		{
			res=redisS.getStrVal(key);
		}else{
			if(smsCode!=null&&smsCode.containsKey(key))
			{
				Map<String, Object> map=smsCode.get(key);
				String ctime=map.get("ctime").toString();
				int bets=IOUtil.getSecBetween2(ctime, IOUtil.getdate("yyyy-MM-dd HH:mm:ss"));
				if(bets/60<=5)
				{
					res=map.get("code").toString();
				}
			}
		}
		return res;
	}
	/**
	 * 存储微信TOKEN
	 * @param token
	 */
	public void setWxToken(String token)
	{
		String key="wxtoken";
		if(ifredis == 1)
		{
			redisS.setVal(key, token,60*110);
		}else{
			JSONObject data=new JSONObject();
			data.put("token", token);
			data.put("ctime", IOUtil.getdate("yyyy-MM-dd HH:mm:ss"));
			String val=data.toString();
			sysConfig.put(key, val);
		}
		
	}
	/**
	 * 查询token，如果超过118分钟，直接返回Null
	 * @return
	 */
	public String getWxToken()
	{
		String res="";
		String key="wxtoken";
		String data="";
		//如果使用redis，直接返回token
		if(ifredis==1){
			return redisS.getStrVal(key);
		}
		if(sysConfig.containsKey(key))
		{
			data=sysConfig.get(key).toString();
		}
		if(StrKit.notBlank(data))
		{
			JSONObject json=new JSONObject(data);
			String ctime=json.getString("ctime");
			if(IOUtil.compare_date( ctime,IOUtil.getTimeByMinute(118))){//在有效时间
				res=json.getString("token");
			}
		}
		return res;
	}
	/**
	 * 存储微信JSTICKET
	 * @param token
	 */
	public void setWxJSTicket(String ticket)
	{
		String key="wxJsTicket";
		if(ifredis==1)
		{
			redisS.setVal(key, ticket,60*110);
		}else{
			JSONObject data=new JSONObject();
			data.put("ticket", ticket);
			data.put("ctime", IOUtil.getdate("yyyy-MM-dd HH:mm:ss"));
			String val=data.toString();
			sysConfig.put(key, val);
		}
	}
	/**
	 * 查询jsticket，如果超过118分钟，直接返回Null
	 * @return
	 */
	public String getWxJsTicket()
	{
		String res="";
		String key="wxJsTicket";
		String data="";
		//如果使用Redis，直接返回
		if(ifredis==1)return redisS.getStrVal(key);
		
		if(sysConfig.containsKey(key))
		{
			data=sysConfig.get(key).toString();
		}
		if(StrKit.notBlank(data))
		{
			JSONObject json=new JSONObject(data);
			String ctime=json.getString("ctime");
			if(IOUtil.compare_date( ctime,IOUtil.getTimeByMinute(118))){//在有效时间
				res=json.getString("ticket");
			}
		}
		return res;
	}
}
